home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
comm
/
term
/
term_source.lha
/
Extras
/
Source
/
gtlayout-source.lha
/
LT_CreateHandle.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-23
|
14KB
|
525 lines
/*
** GadTools layout toolkit
**
** Copyright © 1993-1996 by Olaf `Olsen' Barthel
** Freely distributable.
**
** :ts=4
*/
#ifndef _GTLAYOUT_GLOBAL_H
#include "gtlayout_global.h"
#endif
LayoutHandle * LIBENT
LT_CreateHandle(REG(a0) struct Screen *Screen,REG(a1) struct TextAttr *Font)
{
return(LT_CreateHandleTags(Screen,
LH_Font,Font,
TAG_DONE));
}
/*****************************************************************************/
LayoutHandle *
LT_CreateHandleTags(struct Screen *Screen,...)
{
LayoutHandle *Handle;
va_list VarArgs;
va_start(VarArgs,Screen);
Handle = LT_CreateHandleTagList(Screen,(struct TagItem *)VarArgs);
va_end(VarArgs);
return(Handle);
}
/*****************************************************************************/
/****** gtlayout.library/LT_CreateHandleTagList ******************************************
*
* NAME
* LT_CreateHandleTagList -- Allocate auxilary data required by LT_New()
* and LT_BuildA().
*
* SYNOPSIS
* Handle = LT_CreateHandleTagList(Screen,Tags);
* D0 A0 A1
*
* LayoutHandle *LT_CreateHandleTagList(struct Screen *,struct TagItem *);
*
* Handle = LT_CreateHandleTags(Screen,...);
*
* struct LayoutHandle *LT_CreateHandleTags(struct Screen *,...);
*
* FUNCTION
* Memory is allocated, tables are set up and data is collected
* on a screen a user interface is to be opened on. This
* involves calculating the screen font parameters.
*
* INPUTS
* Screen - Pointer to the screen the user interface is to
* use. Passing NULL will cause the default public
* screen to be used.
*
* NOTE: if NULL is passed the default public screen
* will stay locked until LT_DeleteHandle()
* is called.
*
* Tags - Tag values to control certain aspects of the
* user interface created.
*
*
* Valid tags include:
*
* LAHN_AutoActivate (BOOL) - Set to TRUE if you want the interface
* to always keep a string gadget active if possible. Hitting
* the return key will then cause the next following string
* gadget to get activated, either cycling through all the
* string gadgets available or stopping at the next string
* gadget to have the LAST_LastGadget attribute set.
* Default: TRUE
*
* LAHN_RawKeyFilter (BOOL) - Discard unprocessed IDCMP_RAWKEY
* events. (V13)
* Default: TRUE
*
* LAHN_UserData (APTR) - Store user specific data in the
* LayoutHandle->UserData entry.
*
* NOTE: This tag requires gtlayout.library v9 and the
* corresponding entry in the LayoutHandle exists
* only under gtlayout.library v9 and up. *NEVER*
* write to this entry, use LT_SetAttributes()
* instead.
*
* LAHN_LocaleHook (struct Hook *) - The hook to call when
* locale string IDs are to be mapped to strings. The
* hook function is called with the following parameters:
*
* String = HookFunc(struct Hook *Hook,struct LayoutHandle *Handle,
* D0 A0 A2
* LONG ID)
* A1
*
* The function is to look up the string associated with the ID
* passed in and return the string.
* Default: no locale hook
*
* LAHN_TextAttr (struct TTextAttr *) - The text font to use when
* creating the gadgets and objects.
* Default: Screen->Font
*
* LAHN_CloningPermitted (BOOL) - If a window will not fit onto the
* screen the user interface is intended for, the layout engine
* will scale the interface data down while stepping down in
* font size. If all this fails, the engine will open a custom
* screen for the window; this process is called "cloning".
* The LAHN_CloningPermitted tag controls whether the engine will
* actually try to open the custom screen or just return NULL
* when LT_Build fails.
* Default: TRUE
*
* LAHN_EditHook (struct Hook *) - You can specify a default string
* gadget editing hook to be used for all following string
* gadgets. Your hook should obey the same rules that apply
* to hooks passed via GTST_EditHook/GTIN_EditHook.
* Default: NULL
*
* LAHN_ExactClone (BOOL) - This tag works in conjunction with the
* LAHN_CloningPermitted tag. By default the layout engine will
* try to replicate only the basic characteristics of the
* screen the window was intended to open on. This may result
* in a screen which uses less colours than the original
* screen. You can force the engine to make an almost exact
* clone of the original screen by passing the LAHN_ExactClone
* tag with a value of TRUE.
* Default: FALSE
*
* LAHN_MenuGlyphs (BOOL) - This tag will make the layout engine
* fill in the AmigaGlyph and CheckGlyph entries of the
* LayoutHandle if running under Kickstart 3.0 or higher.
* The corresponding images will be scaled to fit the actual
* screen aspect ratio values and can later be used for
* menu layout.
* Default: FALSE
*
* LAHN_Parent (struct Window *) - You can pass a pointer to the
* parent window of the window you intend to open using
* the user interface layout engine. The new window will
* open inside the boundaries of the parent window. If the
* size does not fit, it will be opened centered over the
* parent window.
* Default: NULL
*
* LAHN_BlockParent (BOOL) - This tag works in conjunction with the
* LAHN_Parent tag. If in effect, will block the parent window
* via LT_LockWindow until the new window is closed, after
* which the parent window is unlocked again.
* Default: FALSE
*
* LAHN_SimpleClone (BOOL) - This tag works in conjunction with the
* LAHN_CloningPermitted tag. It will make the layout engine
* forget most information about the original screen the
* user interface was intended for. In short, it will open a
* simple default screen for the interface.
* Default: FALSE
*
* LAHN_ExitFlush (BOOL) - When the LayoutHandle is finally disposed
* of with LT_DeleteHandle() all variables maintained by the
* input handling code will be flushed. For example, if you
* would use the LA_STRPTR tag for STRING_KIND objects the
* last string gadget contents would be copied into the buffer
* pointed to by LA_STRPTR. If you do not want to use this
* feature, disable it with "LAHN_ExitFlush,FALSE". (V9)
* Default: TRUE
*
* LAHN_NoKeys (BOOL) - Use TRUE to tell the library not to pick
* keyboard shortcuts all on its own. This works like calling
* LT_New() for all objects with "LA_NoKey,TRUE,". (V26)
*
* LAHN_PubScreen (struct Screen *) - Pointer to public screen
* window is to open on. Must be locked and open until you call
* LT_Built().
*
* LAHN_PubScreenName (STRPTR) - Name of public screen to open window
* on. The library will try to lock the named screen as soon as
* you call LT_CreateHandle.
*
* LAHN_PubScreenFallBack (BOOL) - If the named public screen cannot
* be found and you ask for it, the library will lock the default
* public screen (default: TRUE).
*
* RESULT
* Handle - Pointer to a LayoutHandle structure.
*
******************************************************************************
*
*/
LayoutHandle * LIBENT
LT_CreateHandleTagList(REG(a0) struct Screen *Screen,REG(a1) struct TagItem *TagList)
{
LayoutHandle *Handle;
struct Screen *PubScreen;
APTR Pool;
ULONG WA_ScreenTag;
BOOL UnlockThePubScreen;
#ifdef DO_PICKSHORTCUTS
ObtainSemaphore(<P_KeySemaphore);
if(!LTP_Keys[1])
{
UBYTE mapBuffer[2 * 3];
UBYTE remapBuffer[10];
LONG i;
struct InputEvent event;
LTP_Keys[1] = <P_Keys[0][256];
for(i = 32 ; i < 256; i++)
{
if(i == 128)
i = 160;
remapBuffer[0] = i;
remapBuffer[1] = 0;
if(MapANSI(remapBuffer,1,mapBuffer,3,NULL) == 1)
{
if(!(mapBuffer[1] & ~QUALIFIER_SHIFT))
{
event.ie_NextEvent = NULL;
event.ie_Class = IECLASS_RAWKEY;
event.ie_SubClass = 0;
event.ie_Code = mapBuffer[0];
event.ie_Qualifier = mapBuffer[1] & ~QUALIFIER_SHIFT;
event.ie_position.ie_addr = NULL;
if(MapRawKey(&event,remapBuffer,10,NULL) == 1)
LTP_Keys[0][i] = remapBuffer[0];
event.ie_NextEvent = NULL;
event.ie_Class = IECLASS_RAWKEY;
event.ie_SubClass = 0;
event.ie_Code = mapBuffer[0];
event.ie_Qualifier = mapBuffer[1] | QUALIFIER_SHIFT;
event.ie_position.ie_addr = NULL;
if(MapRawKey(&event,remapBuffer,10,NULL) == 1)
LTP_Keys[1][i] = remapBuffer[0];
}
}
}
}
ReleaseSemaphore(<P_KeySemaphore);
#endif /* DO_PICKSHORTCUTS */
UnlockThePubScreen = TRUE;
WA_ScreenTag = WA_CustomScreen;
if(!Screen)
{
if(PubScreen = (struct Screen *)GetTagData(LAHN_PubScreen,NULL,TagList))
{
UnlockThePubScreen = FALSE;
WA_ScreenTag = WA_PubScreen;
Screen = PubScreen;
}
else
{
STRPTR PubName;
if(PubName = (STRPTR)GetTagData(LAHN_PubScreenName,NULL,TagList))
{
if(!(PubScreen = LockPubScreen(PubName)))
{
if(!GetTagData(LAHN_PubScreenFallBack,TRUE,TagList))
return(NULL);
}
}
else
PubScreen = NULL;
if(!PubScreen)
PubScreen = LockPubScreen(NULL);
if(!PubScreen)
return(NULL);
else
{
Screen = PubScreen;
WA_ScreenTag = WA_PubScreen;
}
}
}
else
{
PubScreen = NULL;
UnlockThePubScreen = FALSE;
}
if(Pool = AsmCreatePool(MEMF_PUBLIC | MEMF_ANY | MEMF_CLEAR,1024,1024,SysBase))
{
if(Handle = AsmAllocPooled(Pool,sizeof(LayoutHandle),SysBase))
{
struct TagItem *List,
*Entry;
BOOL MenuGlyphs;
MenuGlyphs = FALSE;
Handle->Pool = Pool;
Handle->Screen = Screen;
Handle->PubScreen = PubScreen;
Handle->PointBack = Handle;
Handle->GroupID = PHANTOM_GROUP_ID;
Handle->WA_ScreenTag = WA_ScreenTag;
Handle->UnlockPubScreen = UnlockThePubScreen;
Handle->ExitFlush = TRUE;
Handle->RawKeyFilter = TRUE;
#ifdef DO_CLONING
Handle->CloningPermitted = TRUE;
#endif
Handle->StandardEditHook = &Handle->DefaultEditHook;
List = TagList;
while(Entry = NextTagItem(&List))
{
switch(Entry->ti_Tag)
{
case LH_Font:
Handle->InitialTextAttr = (struct TextAttr *)Entry->ti_Data;
break;
case LH_MenuGlyphs:
MenuGlyphs = Entry->ti_Data;
break;
case LH_Parent:
Handle->Parent = (struct Window *)Entry->ti_Data;
break;
case LH_BlockParent:
Handle->BlockParent = Entry->ti_Data;
break;
case LH_ExitFlush:
Handle->ExitFlush = Entry->ti_Data;
break;
case LH_UserData:
Handle->UserData = (APTR)Entry->ti_Data;
break;
case LH_RawKeyFilter:
Handle->RawKeyFilter = Entry->ti_Data;
break;
case LH_AutoActivate:
Handle->AutoActivate = Entry->ti_Data;
break;
case LH_LocaleHook:
Handle->LocaleHook = (struct Hook *)Entry->ti_Data;
break;
case LH_EditHook:
Handle->StandardEditHook = (struct Hook *)Entry->ti_Data;
break;
case LAHN_NoKeys:
Handle->NoKeys = Entry->ti_Data;
break;
#ifdef DO_CLONING
case LH_CloningPermitted:
Handle->CloningPermitted = Entry->ti_Data;
break;
case LH_SimpleClone:
if(Handle->SimpleClone = Entry->ti_Data)
Handle->ExactClone = FALSE;
break;
case LH_ExactClone:
if(Handle->ExactClone = Entry->ti_Data)
Handle->SimpleClone = FALSE;
break;
#endif
}
}
#ifdef DO_PASSWORD_KIND
Handle->PasswordEditHook.h_Entry = (HOOKFUNC)LTP_PasswordEditRoutine;
Handle->PasswordEditHook.h_Data = Handle;
#endif
Handle->DefaultEditHook.h_Entry = (HOOKFUNC)LTP_DefaultEditRoutine;
Handle->DefaultEditHook.h_Data = Handle;
Handle->BackfillHook.h_Entry = (HOOKFUNC)LTP_BackfillRoutine;
Handle->BackfillHook.h_Data = Handle;
#ifdef DO_HEXHOOK
Handle->HexEditHook.h_Entry = (HOOKFUNC)LTP_HexEditRoutine;
Handle->HexEditHook.h_Data = Handle;
#endif
if(Handle->DrawInfo = GetScreenDrawInfo(Screen))
{
LONG i;
Handle->TextPen = Handle->DrawInfo->dri_Pens[TEXTPEN];
Handle->BackgroundPen = Handle->DrawInfo->dri_Pens[BACKGROUNDPEN];
Handle->ShinePen = Handle->DrawInfo->dri_Pens[SHINEPEN];
Handle->ShadowPen = Handle->DrawInfo->dri_Pens[SHADOWPEN];
Handle->AspectX = Handle->DrawInfo->dri_Resolution.X;
Handle->AspectY = Handle->DrawInfo->dri_Resolution.Y;
if(Handle->BackgroundPen)
InitRastPort(&Handle->BackfillRastPort);
if(V39 && MenuGlyphs)
{
LONG i,Size,Width,Height = Handle->DrawInfo->dri_Font->tf_Baseline + 2;
struct Image **Glyphs[2];
Glyphs[0] = &Handle->AmigaGlyph;
Glyphs[1] = &Handle->CheckGlyph;
if(Screen->Flags & SCREENHIRES)
Size = SYSISIZE_MEDRES;
else
Size = SYSISIZE_LOWRES;
for(i = 0 ; i < 2 ; i++)
{
if(i)
Width = (Height * Handle->AspectY) / Handle->AspectX;
else
Width = (Height * 3 * Handle->AspectY) / (2 * Handle->AspectX);
if(!(*Glyphs[i] = NewObject(NULL,SYSICLASS,
SYSIA_DrawInfo, Handle->DrawInfo,
SYSIA_Size, Size,
SYSIA_Which, i ? MENUCHECK : AMIGAKEY,
IA_Width, Width,
IA_Height, Height,
TAG_DONE)))
{
DisposeObject(*Glyphs[0]);
*Glyphs[0] = NULL;
break;
}
}
}
for(i = 0 ; i < Handle->DrawInfo->dri_NumPens ; i++)
{
if(Handle->DrawInfo->dri_Pens[i] > Handle->MaxPen)
Handle->MaxPen = Handle->DrawInfo->dri_Pens[i];
}
if(Handle->VisualInfo = GetVisualInfoA(Screen,NULL))
{
InitRastPort(&Handle->RPort);
if(LTP_GlyphSetup(Handle,Handle->InitialTextAttr))
{
#ifdef DO_PICKSHORTCUTS
memset(Handle->Keys,TRUE,256);
for(i = 0 ; i < 256 ; i++)
{
if(i != 32 && i != 160)
{
if(LTP_Keys[0][i])
Handle->Keys[LTP_Keys[0][i]] = FALSE;
if(LTP_Keys[1][i])
Handle->Keys[LTP_Keys[1][i]] = FALSE;
}
}
#endif
return(Handle);
}
}
}
LT_DeleteHandle(Handle);
}
else
AsmDeletePool(Pool,SysBase);
}
else
UnlockPubScreen(NULL,PubScreen);
return(NULL);
}